package cn.edu.lcu.cs.javaprogramming.oop.innerclass;

/**
 * 内部类演示，内部类派生自另外一个类
 * 
 * @author Ling
 *
 */
public class InnerClazzExtendsSuperClazz {
	public static void main(String[] args) {
		anonymousInnerClazz();
		namedInnerClazz();
	}

	/**
	 * <li>具名内部类演示</li>
	 */
	private static void namedInnerClazz() {
		/**
		 * 带名称的内部类，在定义之外可以访问
		 * 
		 * @author Ling
		 *
		 */
		class NamedInnerClazz extends Object {
			public void show() {
				System.out.println("NamedInnerClazz");
			}
		}

		// 因为是带名称的内部类，可以通过类名访问
		NamedInnerClazz innerClazz = new NamedInnerClazz();
		innerClazz.show();

		// 可以重复通过类名访问具名内部类
		NamedInnerClazz innerClazz2 = new NamedInnerClazz();
		innerClazz2.show();

		// 两个不同的内部类实例
		// false
		System.out.println(innerClazz == innerClazz2);

	}

	/**
	 * <li>匿名内部类演示</li>
	 * <li>因为是匿名的，它没有名字，没法在别处访问这个类</li>
	 * <li>因为是匿名的，创建之后需要立即使用它生成实例</li>
	 * <li>匿名内部类的代码一般都非常独特，仅在定义的地方使用，在其它地方没有使用的意义</li>
	 */
	private static void anonymousInnerClazz() {
		// 创建了一个匿名内部类，此类是Object的子类
		// 在创建内部类之后立即生成了一个实例
		new Object() {
			public void show() {
				System.out.println("anonymousInnerClazz");
			}
		// 调用内部类的方法
		}
				.show();
	}
}